Import necessary modules¶

In [1]:
from pathlib import Path

from ipyniivue import download_dataset

BASE_API_URL = "https://niivue.com/demos/images/"
DATA_FOLDER = Path("images")

# Download data for example
download_dataset(
    BASE_API_URL,
    dest_folder=DATA_FOLDER,
    files=[
        "mni152.nii.gz",
        "dpsv.trx",
    ],
)
mni152.nii.gz already exists.
dpsv.trx already exists.
Dataset downloaded successfully to images.
In [2]:
import ipywidgets as widgets

from ipyniivue import NiiVue, SliceType

# Create NiiVue instance

nv = NiiVue(show_3d_crosshair=True, back_color=(0.8, 0.8, 1, 1))

nv.opts.is_colorbar = True
nv.set_slice_type(SliceType.RENDER)
nv.set_clip_plane(-0.1, 270, 0)
# Load the volume and mesh data

nv.load_volumes(
    [
        {"path": DATA_FOLDER / "mni152.nii.gz"},
    ]
)

nv.load_meshes(
    [
        {"path": DATA_FOLDER / "dpsv.trx", "rgba255": [0, 142, 0, 255]},
    ]
)

nv.meshes[0].colormap = "blue"
nv.meshes[0].rgba255 = (0, 255, 255, 255)

# Create sliders and dropdowns

radius_slider = widgets.IntSlider(
    value=0,
    min=0,
    max=20,
    description="Radius",
)

length_slider = widgets.IntSlider(
    value=3,
    min=1,
    max=80,
    description="Length",
)

dither_slider = widgets.IntSlider(
    value=1,
    min=0,
    max=10,
    description="Dither",
)

fiber_coloration_options = [
    ("Global direction", "Global"),
    ("Local direction", "Local"),
    ("Fixed", "Fixed"),
    ("First Per Vertex Type (if available)", "DPV0"),
    ("First Per Streamline Type (if available)", "DPS0"),
]
fiber_color_dropdown = widgets.Dropdown(
    options=fiber_coloration_options,
    value="Global",
    description="Fiber Coloration:",
)

fiber_reduction_options = [("100%", 1), ("50%", 2), ("25%", 4), ("10%", 10)]
fiber_reduction_dropdown = widgets.Dropdown(
    options=fiber_reduction_options,
    value=1,
    description="Fiber Reduction",
)

# Set up callbacks


def on_radius_change(change):
    """Set fiber radius."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_radius", change["new"] * 0.1)


radius_slider.observe(on_radius_change, names="value")


def on_length_change(change):
    """Set fiber length."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_length", change["new"])


length_slider.observe(on_length_change, names="value")


def on_dither_change(change):
    """Set fiber dither."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_dither", change["new"] * 0.1)


dither_slider.observe(on_dither_change, names="value")


def on_fiber_color_change(change):
    """Set fiber color."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_color", change["new"])


fiber_color_dropdown.observe(on_fiber_color_change, names="value")


def on_fiber_reduction_change(change):
    """Set fiber decimation stride."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_decimation_stride", change["new"])


fiber_reduction_dropdown.observe(on_fiber_reduction_change, names="value")

# Display all

controls = widgets.VBox(
    [
        radius_slider,
        length_slider,
        dither_slider,
        fiber_color_dropdown,
        fiber_reduction_dropdown,
    ]
)

widgets.VBox(
    [
        controls,
        nv,
    ]
)
Out[2]: